package cn.kgc.spring.dao.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author: mosin
 * @version: v1.0  2022/4/25
 * 使用Aop的思想实现 OrderDao的功能增强
 * 1.连接点   被代理对象中所有可被增强的方法  连接点
 * 2.切点    被代理对象中实际增强的方法     切点
 * 3.通知    增强的业务
 *      1.前置通知
 *      2.后置通知
 *      3.最终通知
 *      4.异常通知
 *      5.环绕通知
 * 4.切面  =  切点 + 通知
 *
 * 通过定义方法 实现业务的增强
 */
@Aspect   // 业务增强类
@Component // 将业务增强类 添加到spring容器管理
public class OrderDaoAOP {

    //前置通知
    @Before("execution(* cn.kgc.spring.dao.impl.OrderDaoImpl.saveOrder(..))")
    public void  before(){
        System.out.println("前置通知AOP.....");
    }
    //后置通知
    @AfterReturning("execution(* cn.kgc.spring.dao.impl.OrderDaoImpl.saveOrder(..))")
    public void  afterReturning(){
        System.out.println("后置通知AOP.....");
    }
    //最终通知
    @After("execution(* cn.kgc.spring.dao.impl.OrderDaoImpl.saveOrder(..))")
    public void  after(){
        System.out.println("最终通知AOP.....");
    }

    //异常通知
    @AfterThrowing("execution(* cn.kgc.spring.dao.impl.OrderDaoImpl.saveOrder(..))")
    public void  afterThrowing(){
        System.out.println("异常通知AOP.....");
    }

    //环绕通知
    @Around("execution(* cn.kgc.spring.dao.impl.OrderDaoImpl.saveOrder(..))")
    public  Object around(ProceedingJoinPoint proceedingJoinPoint){

        try {
            System.out.println("环绕前通知AOP.....");
            //被代理对象中被调用的方法
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("环绕后通知AOP.....");
            return  proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;

    }
}
